/**
 * 本处主要示例如何结合特质绑定和通用参数定义复杂的函数
 */
#[derive(Debug)]
struct Program{
    lan:String,
    name:String,
    author:String,
    price:u32
}
type BoxP=Box<Program>;
/**
 * 使用特质绑定+泛型参数定义一个函数，该函数接收一个实现了FnMut特质的对象和一个可变引用
 */
fn test_FnMut<T:FnMut(&mut BoxP)>(mut f:T,p:&mut BoxP){
    f(p);
}

fn main(){
    let p = Program{
        lan:"Rust".to_string(),
        name:String::from("Rust程序设计语言"),
        author:String::from("Steve Klabnik and Carol Nichols"),
        price:59,
    };
    let mut p_box = Box::new(p);

    let mut f=|p:&mut BoxP|{
        println!("{:?}",p);
        p.price+=2012103;
    };
    test_FnMut(f,&mut p_box);
    f(&mut p_box);
    println!("{},{},{}",p_box.name,p_box.author,p_box.price);
}